﻿'######################################################################################################################################
'# CLASSE ALLOCINE:
'#  - Charge les informations sur l'API allocine.fr
'######################################################################################################################################

'######################################################################################################################################
'# CLASSE MENU_CONTEXTUEL:
'######################################################################################################################################
Imports System.IO
Imports System.Xml
Imports System.Net
Imports System.Drawing
Imports MediaPortal.GUI.Library
Imports MediaPortal.Dialogs
Imports SMC.Gestion_XML

Public Class Allocine
    Private _Parent As Plugin

    Private Structure STRUC_Allocine
        Dim Id As String
        Dim Titre As String
        Dim Annee As String
        Dim Image As String
    End Structure

    '######################################################################################################################################
    '# Constructeur
    '######################################################################################################################################
    Public Sub New(ByVal CLASS_Param1 As Plugin)
        _Parent = CLASS_Param1
    End Sub
    '######################################################################################################################################

    '######################################################################################################################################
    '# Prend en paramètre une adresse HTTP et renvoi une chaine ASCII
    '######################################################################################################################################
    Private Function HTTP_Requete(ByVal STR_URI As String)
        MediaPortal.GUI.Library.Log.Debug("[SMC] Allocine.vb >> Execution de HTTP_Requete()", "")
        Dim OBJ_WebRequete As WebRequest
        Dim OBJ_WebReponse As WebResponse
        Dim OBJ_Steamreader As StreamReader

        OBJ_WebRequete = WebRequest.Create(STR_URI)
        OBJ_WebRequete.ContentType = "application/x-www-form-urlencoded"
        OBJ_WebRequete.Method = "POST"
        'Contourne le probleme erreur 401, mais je ne sais pas pourquoi
        OBJ_WebRequete.ContentLength = 0
        If _Parent.Proxy = True Then OBJ_WebRequete.Proxy = New WebProxy("http://132.147.56.55:80/")

        OBJ_WebReponse = OBJ_WebRequete.GetResponse
        OBJ_Steamreader = New StreamReader(OBJ_WebReponse.GetResponseStream)
        Return OBJ_Steamreader.ReadToEnd().Trim()
    End Function
    '######################################################################################################################################

    '######################################################################################################################################
    '# Telecharger Jaquette
    '######################################################################################################################################
    Private Sub HTTP_Telecharger(ByVal STR_PARAM1 As String, ByVal STR_PARAM2 As String)
        MediaPortal.GUI.Library.Log.Debug("[SMC] Allocine.vb >> Execution de HTTP_Telecharger()", "")
        Dim OBJ_WEBCLIENT As New WebClient
        Dim DLG_PROGRESSION As GUIDialogProgress
        Dim OBJ_WEBREQUETE As HttpWebRequest
        Dim OBJ_WEBREPONSE As HttpWebResponse
        Dim INT_TAILLE As Integer
        Dim INT_PROGRESSION As Integer
        Dim STREAM_SOURCE As Stream
        Dim STREAM_DESTINATION As Stream
        Dim INT_ByteSize As Integer
        Dim BYT_byteBuffer As Byte()

        DLG_PROGRESSION = GUIWindowManager.GetWindow(GUIWindow.Window.WINDOW_DIALOG_PROGRESS)
        DLG_PROGRESSION.SetHeading("ALLOCINE")
        DLG_PROGRESSION.SetLine(1, "TELECHARGEMENT")
        DLG_PROGRESSION.SetLine(2, "")
        DLG_PROGRESSION.SetLine(3, "")
        DLG_PROGRESSION.SetLine(4, "")
        DLG_PROGRESSION.StartModal(GUIWindowManager.ActiveWindow)
        DLG_PROGRESSION.SetPercentage(0)
        DLG_PROGRESSION.Progress()
        DLG_PROGRESSION.ShowProgressBar(True)

        If _Parent.Proxy = True Then OBJ_WEBCLIENT.Proxy = New WebProxy("http://132.147.56.55:80/")

        'On prend la taille du fichier
        OBJ_WEBREQUETE = HttpWebRequest.Create(STR_PARAM1)
        OBJ_WEBREPONSE = OBJ_WEBREQUETE.GetResponse
        OBJ_WEBREPONSE.Close()
        INT_TAILLE = OBJ_WEBREPONSE.ContentLength
        INT_PROGRESSION = 0
        STREAM_SOURCE = OBJ_WEBCLIENT.OpenRead(STR_PARAM1)
        STREAM_DESTINATION = New FileStream(STR_PARAM2, FileMode.Create, FileAccess.Write, FileShare.None)
        INT_ByteSize = 0
        ReDim BYT_byteBuffer(INT_TAILLE)
        INT_ByteSize = STREAM_SOURCE.Read(BYT_byteBuffer, 0, BYT_byteBuffer.Length)
        While INT_ByteSize > 0
            STREAM_DESTINATION.Write(BYT_byteBuffer, 0, INT_ByteSize)
            INT_PROGRESSION += INT_ByteSize
            DLG_PROGRESSION.SetPercentage((INT_PROGRESSION / BYT_byteBuffer.Length) * 100)
            DLG_PROGRESSION.Progress()
            INT_ByteSize = STREAM_SOURCE.Read(BYT_byteBuffer, 0, BYT_byteBuffer.Length)
        End While
        STREAM_DESTINATION.Close()
        STREAM_SOURCE.Close()

        DLG_PROGRESSION.Close()
    End Sub
    '######################################################################################################################################

    '######################################################################################################################################
    '# Reduire Image
    '######################################################################################################################################
    Private Sub Reduire_Image(ByVal STR_PARAM1 As String)
        MediaPortal.GUI.Library.Log.Debug("[SMC] Allocine.vb >> Execution de Reduire_Image()", "")
        Dim BMP_Image As New Bitmap(STR_PARAM1)
        Dim BMP_Reduite As Bitmap
        Dim INT_Hauteur As Integer
        Dim OBJ_Graphique As Graphics
        Dim BOOL_FichierCopie As Boolean
        Dim TIMER_DepartSecondes As Integer
        Dim TIMER_Declenche As Boolean
        Dim TIMER_DepartMinutes As Integer

        INT_Hauteur = Math.Round(BMP_Image.Height * (600 / BMP_Image.Width))
        BMP_Reduite = New Bitmap(600, INT_Hauteur)

        OBJ_Graphique = Graphics.FromImage(BMP_Reduite)
        OBJ_Graphique.InterpolationMode = Drawing2D.InterpolationMode.HighQualityBicubic
        OBJ_Graphique.DrawImage(BMP_Image, New Rectangle(0, 0, BMP_Reduite.Width, BMP_Reduite.Height), New Rectangle(0, 0, BMP_Image.Width, BMP_Image.Height), GraphicsUnit.Pixel)
        OBJ_Graphique.Dispose()

        BMP_Image.Dispose()
        TIMER_DepartSecondes = DateTime.Now.Second
        TIMER_DepartMinutes = DateTime.Now.Minute
        TIMER_Declenche = False
        While Not BOOL_FichierCopie
            If TIMER_Declenche = False And TIMER_DepartSecondes <> DateTime.Now.Second Then TIMER_Declenche = True
            If TIMER_Declenche = True Then
                If TIMER_DepartMinutes = DateTime.Now.Minute Then
                    If DateTime.Now.Second - TIMER_DepartSecondes > 10 Then BOOL_FichierCopie = True
                Else
                    If (DateTime.Now.Second + 60) - TIMER_DepartSecondes > 10 Then BOOL_FichierCopie = True
                End If
            End If
            Try
                BMP_Reduite.Save(STR_PARAM1, System.Drawing.Imaging.ImageFormat.Png)
                BOOL_FichierCopie = True
            Catch
                BOOL_FichierCopie = False
            End Try
        End While
        BMP_Reduite.Dispose()
    End Sub
    '######################################################################################################################################

    '######################################################################################################################################
    '# Lance la recherche sur le fichier avec son chemin complet
    '######################################################################################################################################
    Public Sub Recherce_Film(ByVal STR_PARAM1 As String)
        MediaPortal.GUI.Library.Log.Debug("[SMC] Allocine.vb >> Execution de Recherce_Film()", "")
        Dim XML_Resultat As New XmlDocument
        Dim XML_Resultat2 As New XmlDocument
        Dim XML_Noeud As XmlNodeList
        Dim XML_Noeud2 As XmlNodeList
        Dim XML_Valeur As XmlNodeList
        Dim STR_Recherche As String
        Dim STR_TITRE As String
        Dim i As Integer
        Dim j As Integer
        Dim Resultats() As STRUC_Allocine
        Dim Resultats_temp As STRUC_Allocine
        Dim DLG_Films As GUIDialogMenu
        Dim DLG_Info As GUIDialogOK
        Dim XML_Contenu As STRUC_XML_smc
        Dim STR_Synopsis As String

        ReDim Resultats(-1)
        STR_Recherche = Mid(STR_PARAM1, InStrRev(STR_PARAM1, "\") + 1)
        If InStr(STR_Recherche, ".") > 0 Then STR_Recherche = Left(STR_Recherche, InStrRev(STR_Recherche, ".") - 1)
        STR_Recherche = Replace(STR_Recherche, "&", " et ")
        XML_Resultat.LoadXml(HTTP_Requete("http://api.allocine.fr/xml/search?q=" & STR_Recherche & "&partner=3"))
        XML_Noeud = XML_Resultat.GetElementsByTagName("movie")
        If XML_Noeud.Count > 0 Then
            For i = 0 To XML_Noeud.Count - 1
                XML_Valeur = XML_Noeud(i).ChildNodes
                ReDim Preserve Resultats(UBound(Resultats) + 1)
                Resultats(UBound(Resultats)).Id = XML_Noeud(i).Attributes("code").Value

                For j = 0 To XML_Valeur.Count - 1
                    Select Case XML_Valeur(j).Name
                        Case "originalTitle"
                            Resultats(UBound(Resultats)).Titre = XML_Valeur(j).InnerText
                        Case "title"
                            'S'il existe un titre en francais, alors on ecrase le titre en anglais
                            Resultats(UBound(Resultats)).Titre = XML_Valeur(j).InnerText
                        Case "productionYear"
                            Resultats(UBound(Resultats)).Annee = XML_Valeur(j).InnerText
                        Case "poster"
                            Resultats(UBound(Resultats)).Image = XML_Valeur(j).Attributes("href").InnerText
                    End Select
                Next
            Next


            DLG_Films = GUIWindowManager.GetWindow(GUIWindow.Window.WINDOW_DIALOG_MENU)
            DLG_Films.ShowQuickNumbers = False
            DLG_Films.SetHeading(STR_Recherche)

            'Souvent c'est le dernier de la liste que l'on souhaite, donc on le place en 2eme
            If UBound(Resultats) > 1 Then
                Resultats_temp.Annee = Resultats(1).Annee
                Resultats_temp.Id = Resultats(1).Id
                Resultats_temp.Image = Resultats(1).Image
                Resultats_temp.Titre = Resultats(1).Titre

                Resultats(1).Annee = Resultats(UBound(Resultats)).Annee
                Resultats(1).Annee = Resultats(UBound(Resultats)).Id
                Resultats(1).Annee = Resultats(UBound(Resultats)).Image
                Resultats(1).Annee = Resultats(UBound(Resultats)).Titre

                Resultats(UBound(Resultats)).Annee = Resultats_temp.Annee
                Resultats(UBound(Resultats)).Id = Resultats_temp.Id
                Resultats(UBound(Resultats)).Image = Resultats_temp.Image
                Resultats(UBound(Resultats)).Titre = Resultats_temp.Titre
            End If

            For i = 0 To UBound(Resultats)
                STR_TITRE = Resultats(i).Titre
                If Resultats(i).Annee <> "" And Resultats(i).Annee <> "0" Then STR_TITRE = STR_TITRE & " (" & Resultats(i).Annee & ")"
                DLG_Films.Add(STR_TITRE)
            Next

            DLG_Films.DoModal(GUIWindowManager.ActiveWindow)
            If DLG_Films.SelectedLabel >= 0 Then
                XML_Resultat2.LoadXml(HTTP_Requete("http://api.allocine.fr/xml/movie?code=" & Resultats(DLG_Films.SelectedLabel).Id & "&partner=3"))
                XML_Noeud2 = XML_Resultat2.GetElementsByTagName("movie")
                STR_Synopsis = ""
                If XML_Noeud2.Count > 0 Then
                    XML_Valeur = XML_Noeud2(0).ChildNodes
                    For j = 0 To XML_Valeur.Count - 1
                        If XML_Valeur(j).Name = "synopsis" Then STR_Synopsis = XML_Valeur(j).InnerText
                    Next
                End If

                If File.Exists(STR_PARAM1 & ".j.smc") Then File.Delete(STR_PARAM1 & ".j.smc")
                If Resultats(DLG_Films.SelectedLabel).Image <> "" Then HTTP_Telecharger(Resultats(DLG_Films.SelectedLabel).Image, STR_PARAM1 & ".j.smc")
                Reduire_Image(STR_PARAM1 & ".j.smc")
                GUITextureManager.Clear()

                XML_Contenu = _Parent.SMC_Gestion_XML.LireElements(STR_PARAM1 & ".smc")
                XML_Contenu.Synopsis = STR_Synopsis
                _Parent.SMC_Gestion_XML.EcrireElements(STR_PARAM1 & ".smc", XML_Contenu)
                _Parent.SMC_Explorer.VideoElements(_Parent.SMC_Explorer.INT_Fichier_PositionAbsolue).Synopsis = XML_Contenu.Synopsis
                _Parent.SMC_Explorer.EXPLORER_Rafraichir()
            End If
        Else
            DLG_Info = CType(GUIWindowManager.GetWindow(CType(GUIWindow.Window.WINDOW_DIALOG_OK, Integer)), GUIDialogOK)
            DLG_Info.SetHeading("Recherche:")
            DLG_Info.SetLine(1, "Aucun résultat trouvé")
            DLG_Info.DoModal(GUIWindowManager.ActiveWindow)

        End If
    End Sub
    '######################################################################################################################################

    '######################################################################################################################################
    '# Lance la recherche sur le fichier avec son chemin complet
    '######################################################################################################################################
    Public Sub Recherce_Serie(ByVal STR_PARAM1 As String)
        MediaPortal.GUI.Library.Log.Debug("[SMC] Allocine.vb >> Execution de Recherce_Serie()", "")
        Dim XML_Resultat As New XmlDocument
        Dim XML_Resultat2 As New XmlDocument
        Dim XML_Noeud As XmlNodeList
        Dim XML_Valeur As XmlNodeList
        Dim STR_Recherche As String
        Dim STR_TITRE As String
        Dim i As Integer
        Dim j As Integer
        Dim Resultats() As STRUC_Allocine
        Dim Resultats_temp As STRUC_Allocine
        Dim DLG_Films As GUIDialogMenu
        Dim DLG_Info As GUIDialogOK

        ReDim Resultats(-1)
        STR_Recherche = Mid(STR_PARAM1, InStrRev(STR_PARAM1, "\") + 1)
        If InStr(STR_Recherche, ".") Then STR_Recherche = Left(STR_Recherche, InStrRev(STR_Recherche, ".") - 1)
        STR_Recherche = Replace(STR_Recherche, "&", " et ")
        XML_Resultat.LoadXml(HTTP_Requete("http://api.allocine.fr/xml/search?q=" & STR_Recherche & "&partner=3"))
        XML_Noeud = XML_Resultat.GetElementsByTagName("tvseries")
        If XML_Noeud.Count > 0 Then
            For i = 0 To XML_Noeud.Count - 1
                XML_Valeur = XML_Noeud(i).ChildNodes
                ReDim Preserve Resultats(UBound(Resultats) + 1)
                Resultats(UBound(Resultats)).Id = XML_Noeud(i).Attributes("code").Value

                For j = 0 To XML_Valeur.Count - 1
                    Select Case XML_Valeur(j).Name
                        Case "originalTitle"
                            Resultats(UBound(Resultats)).Titre = XML_Valeur(j).InnerText
                        Case "title"
                            'S'il existe un titre en francais, alors on ecrase le titre en anglais
                            Resultats(UBound(Resultats)).Titre = XML_Valeur(j).InnerText
                        Case "yearStart"
                            Resultats(UBound(Resultats)).Annee = XML_Valeur(j).InnerText
                        Case "poster"
                            Resultats(UBound(Resultats)).Image = XML_Valeur(j).Attributes("href").InnerText
                    End Select
                Next
            Next


            DLG_Films = GUIWindowManager.GetWindow(GUIWindow.Window.WINDOW_DIALOG_MENU)
            DLG_Films.ShowQuickNumbers = False
            DLG_Films.SetHeading(STR_Recherche)

            'Souvent c'est le dernier de la liste que l'on souhaite, donc on le place en 2eme
            If UBound(Resultats) > 1 Then
                Resultats_temp.Annee = Resultats(1).Annee
                Resultats_temp.Id = Resultats(1).Id
                Resultats_temp.Image = Resultats(1).Image
                Resultats_temp.Titre = Resultats(1).Titre

                Resultats(1).Annee = Resultats(UBound(Resultats)).Annee
                Resultats(1).Annee = Resultats(UBound(Resultats)).Id
                Resultats(1).Annee = Resultats(UBound(Resultats)).Image
                Resultats(1).Annee = Resultats(UBound(Resultats)).Titre

                Resultats(UBound(Resultats)).Annee = Resultats_temp.Annee
                Resultats(UBound(Resultats)).Id = Resultats_temp.Id
                Resultats(UBound(Resultats)).Image = Resultats_temp.Image
                Resultats(UBound(Resultats)).Titre = Resultats_temp.Titre
            End If

            For i = 0 To UBound(Resultats)
                STR_TITRE = Resultats(i).Titre
                If Resultats(i).Annee <> "" And Resultats(i).Annee <> "0" Then STR_TITRE = STR_TITRE & " (" & Resultats(i).Annee & ")"
                DLG_Films.Add(STR_TITRE)
            Next

            DLG_Films.DoModal(GUIWindowManager.ActiveWindow)

            If DLG_Films.SelectedLabel >= 0 Then

                If File.Exists(STR_PARAM1 & ".j.smc") Then File.Delete(STR_PARAM1 & ".j.smc")
                If Resultats(DLG_Films.SelectedLabel).Image <> "" Then HTTP_Telecharger(Resultats(DLG_Films.SelectedLabel).Image, STR_PARAM1 & ".j.smc")
                Reduire_Image(STR_PARAM1 & ".j.smc")
                GUITextureManager.Clear()

                _Parent.SMC_Explorer.EXPLORER_Rafraichir()
            End If
        Else
            DLG_Info = CType(GUIWindowManager.GetWindow(CType(GUIWindow.Window.WINDOW_DIALOG_OK, Integer)), GUIDialogOK)
            DLG_Info.SetHeading("Recherche:")
            DLG_Info.SetLine(1, "Aucun résultat trouvé")
            DLG_Info.DoModal(GUIWindowManager.ActiveWindow)

        End If
    End Sub
    '######################################################################################################################################

End Class
